bffd5021dd7ae5d40bd975da4330fffa405812f2,src/mltk/predictor/gam/GA2MLearner.java,GA2MLearner,buildClassifier,#GAM#List#Instances#number#,384
Before Change
// Derivitive to attribute k
// Minimizes the loss function: log(1 + exp(-2yF))
for (int i = 0; i < trainSet.size(); i++) {
double r = OptimUtils.getPseudoResidual(predictionTrain[i], target[i]);
trainSet.get(i).setTarget(r);
}
After Change
// Initialize predictions and residuals
double[] pTrain = new double[trainSet.size()];
double[] rTrain = new double[trainSet.size()];
OptimUtils.computePseudoResidual(pTrain, target, rTrain);
for (int i = 0; i < pTrain.length; i++) {
Instance instance = trainSet.get(i);
pTrain[i] = gam.regress(instance);
}
// Gradient boosting
for (int iter = 0; iter < maxNumIters; iter++) {
int k = iter % terms.size();
// Derivitive to attribute k
// Minimizes the loss function: log(1 + exp(-2yF))
for (int i = 0; i < trainSet.size(); i++) {
trainSet.get(i).setTarget(rTrain[i]);
}
BoostedEnsemble boostedEnsemble = regressors.get(k);
// Train model
IntPair term = terms.get(k);
cutter.setAttIndices(term.v1, term.v2);
BaggedEnsemble baggedEnsemble = learner.build(bags);
if (learningRate != 1) {
for (int i = 0; i < baggedEnsemble.size(); i++) {
Function2D func = (Function2D) baggedEnsemble.get(i);
func.multiply(learningRate);
}
}
boostedEnsemble.add(baggedEnsemble);
// Update predictions
for (int i = 0; i < trainSet.size(); i++) {
Instance instance = trainSet.get(i);
double pred = baggedEnsemble.regress(instance);
pTrain[i] += pred;
rTrain[i] = OptimUtils.getPseudoResidual(pTrain[i], target[i]);
}
double measure = metric.eval(pTrain, target);